package Executor;

import java.util.ArrayDeque;
import java.util.Queue;
import java.util.concurrent.Executor;


/**
 * 将所有的任务都加到一个 queue 中，
 * 然后从 queue 中取任务，交给真正的执行器执行，
 * 这里采用 synchronized 进行并发控制
 */
public class Executor_01 implements Executor {


    //任务队列
    final Queue<Runnable> task = new ArrayDeque<Runnable>();
    //真正的执行器
    final Executor executor;

    public Executor_01(Executor executor) {
        this.executor = executor;
    }

    // 当前正在执行的任务
    Runnable active;

    // 添加任务到线程池:将任务添加到任务队列，scheduleNext 触发执行器去任务队列取任务
    @Override
    public synchronized void execute(Runnable command) {
        //将任务添加到任务队列
        task.offer(new Runnable() {
            @Override
            public void run() {
                try {
                    command.run();
                } finally {
                    scheduleNext();
                }
            }
        });
        //当前没有执行任务
        if (active == null) {
            scheduleNext();
        }
    }


    protected synchronized void scheduleNext() {
        if ((active = task.poll()) != null) {
            // 具体的执行转给真正的执行器 executor
            executor.execute(active);
        }
    }
}
